/*
@title: Sprig Piano Simulator
@author: unknown
@tags: []
@description: A piano simulator that lets you play musical notes using keyboard controls. Features a built-in example tune (Twinkle Twinkle Little Star) and allows you to play individual notes. Each key on the virtual piano corresponds to a different musical note.
@addedOn: 2024-01-01
*/

const tunes = {
    'C': tune`
500: C4~500,
15500`,
    'D': tune`
500: D4~500,
15500`,
    'E': tune`
500: E4~500,
15500`,
    'F': tune`
500: F4~500,
15500`,
    'G': tune`
500: G4~500,
15500`,
    'A': tune`
500: A4~500,
15500`,
    'B': tune`
500: B4~500,
15500`
};

// Preset tune (Example: Twinkle Twinkle Little Star)
const twinkle = tune`
500: C4~500,
500: C4~500,
500: G4~500,
500: G4~500,
500: A4~500,
500: A4~500,
500: G4~500,
500,
500: F4~500,
500: F4~500,
500: E4~500,
500: E4~500,
500: D4~500,
500: D4~500,
500: C4~500,
500,
500: G4~500,
500: G4~500,
500: F4~500,
500: F4~500,
500: E4~500,
500: E4~500,
500: D4~500,
500,
500: G4~500,
500: G4~500,
500: F4~500,
500: F4~500,
500: E4~500,
500: E4~500,
500: D4~500,
500,
500: C4~500,
500: C4~500,
500: G4~500,
500: G4~500,
500: A4~500,
500: A4~500,
500: G4~500,
500,
500: F4~500,
500: F4~500,
500: E4~500,
500: E4~500,
500: D4~500,
500: D4~500,
500: C4~500`;

const white = "w";
const black = "n";
const C = 'c';
const D = 'd';
const E = 'e';
const F = 'f';
const G = 'g';
const A = 'a';
const B = 'b';
setLegend(
  [white, bitmap`
2222222222222222
2222222222222222
2222222222222222
2222222222222222
2222222222222222
2222222222222222
2222222222222222
2222222222222222
2222222222222222
2222222222222222
2222222222222222
2222222222222222
2222222222222222
2222222222222222
2222222222222222
2222222222222222`],
  [black, bitmap `
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000`],
  [C, bitmap`
2222222222222222
2222222222222222
2222200000022222
2222002222222222
2220022222222222
2220222222222222
2220222222222222
2220222222222222
2220222222222222
2220222222222222
2220222222222222
2220022222222222
2222002222222222
2222200000022222
2222222222222222
2222222222222222`],
  [D, bitmap `
2222222222222222
2222222222222222
2222222222222222
2222000022222222
2222022000222222
2222022220022222
2222022222002222
2222022222202222
2222022222202222
2222022222002222
2222022220022222
2222022200222222
2222000002222222
2222222222222222
2222222222222222
2222222222222222`],
  [E, bitmap `
2222222222222222
2222222222222222
2222000000002222
2222022222222222
2222022222222222
2222022222222222
2222022222222222
2222000000002222
2222022222222222
2222022222222222
2222022222222222
2222022222222222
2222000000002222
2222222222222222
2222222222222222
2222222222222222`],
  [F, bitmap `
2222222222222222
2222222222222222
2222222222222222
2222200000002222
2222202222222222
2222202222222222
2222202222222222
2222202222222222
2222200000002222
2222202222222222
2222202222222222
2222202222222222
2222202222222222
2222202222222222
2222222222222222
2222222222222222`],
  [G, bitmap `
2222222222222222
2222222222222222
2222222222222222
2222220000022222
2222002222222222
2220222222222222
2200222222222222
2202222222222222
2202222222222222
2202222000002222
2202222220202222
2202222220202222
2220000000202222
2222222222222222
2222222222222222
2222222222222222`],
  [A, bitmap `
2222222222222222
2222222222222222
2222200000002222
2222002222202222
2220022222220222
2220222222220222
2220222222220222
2220222222220222
2220222222220222
2220000000000222
2220222222220222
2220222222220222
2220222222220222
2220222222220222
2222222222222222
2222222222222222` ],
  [B, bitmap `
2222222222222222
2222222222222222
2222222222222222
2222222222222222
2222200000022222
2222202222002222
2222202222202222
2222202222002222
2222200000022222
2222202222002222
2222202222202222
2222202222002222
2222200000022222
2222222222222222
2222222222222222
2222222222222222`]
);
const start = map`
wwwwwwwwwwwwwwwwwwwwwwwwww
wnnnwwnnnwwnnnnwnnnnwnnnnw
wnwwnwnwwnwnwwwwnwwwwnwwww
wnwwnwnwwnwnwwwwnwwwwnwwww
wnnnwwnnnwwnnnnwnnnnwnnnnw
wnwwwwnnwwwnwwwwwwwnwwwwnw
wnwwwwnwnwwnwwwwwwwnwwwwnw
wnwwwwnwwnwnnnnwnnnnwnnnnw
wwwwwwwwwwwwwwwwwwwwwwwwww
wnwwnwnnnnwnwnwnnnnnwnnnnw
wnwnwwnwwwwnwnwwwnwwwnwwnw
wnnwwwnwwwwnwnwwwnwwwnwwnw
wnwwwwnnnnwwnwwwwnwwwnwwnw
wnnwwwnwwwwwnwwwwnwwwnwwnw
wnwnwwnwwwwwnwwwwnwwwnwwnw
wnwwnwnnnnwwnwwwwnwwwnnnnw
wwwwwwwwwwwwwwwwwwwwwwwwww
wwwwnnnwwnwwwwwnnwwnwnwwww
wwwwnwwnwnwwwwnwwnwnwnwwww
wwwwnwwnwnwwwwnwwnwnwnwwww
wwwwnnnwwnwwwwnnnnwwnwwwww
wwwwnwwwwnwwwwnwwnwwnwwwww
wwwwnwwwwnwwwwnwwnwwnwwwww
wwwwnwwwwnnnnwnwwnwwnwwwww
wwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwww`
setMap(start)

// Key mappings
onInput("w", () => { playTune(tunes['C']); setMap(C); });
onInput("a", () => { playTune(tunes['D']); setMap(D); });
onInput("s", () => { playTune(tunes['E']); setMap(E); });
onInput("d", () => { playTune(tunes['F']); setMap(F); });
onInput("i", () => { playTune(tunes['G']); setMap(G); });
onInput("j", () => { playTune(tunes['A']); setMap(A); });
onInput("k", () => { playTune(tunes['B']); setMap(B); });
// Play preset tune
onInput("l", () => {
  playTune(twinkle);
  setMap(start);
});
